import pandas as pd
import numpy as np

# 读取Excel文件
file_path = r'd:\费用.xlsx'
df = pd.read_excel(file_path)

# 假设Excel文件中有两列：'不含税单价' 和 '业务量'
# 如果列名不同，请根据实际情况修改
unit_price_column = '不含税单价'
business_volume_column = '业务量'

# 检查列是否存在
if unit_price_column not in df.columns:
    raise ValueError(f"列 '{unit_price_column}' 不存在于Excel文件中")
if business_volume_column not in df.columns:
    df[business_volume_column] = 0

# 检查是否有缺失值
if df[unit_price_column].isnull().any():
    raise ValueError(f"列 '{unit_price_column}' 包含缺失值")

# 检查是否有零值
if (df[unit_price_column] == 0).any():
    raise ValueError(f"列 '{unit_price_column}' 包含零值")

# 四舍五入单价到两位小数
df[unit_price_column] = df[unit_price_column].round(2)

# 计算总业务量
total_cost = 9825.88

# 计算每行的成本比例
cost_proportions = df[unit_price_column] / df[unit_price_column].sum()

# 计算每行的业务量（浮点数）
df['业务量_浮点'] = cost_proportions * (total_cost / df[unit_price_column])

# 将业务量向下取整
df[business_volume_column] = df['业务量_浮点'].apply(np.floor).astype(int)

# 计算当前业务量对应的总成本
current_total_cost = (df[business_volume_column] * df[unit_price_column]).sum()

# 计算剩余的业务量
remaining_cost = total_cost - current_total_cost

# 调整业务量以确保总成本尽可能接近 9825.88
while remaining_cost > 0:
    # 计算每行增加一个业务量后的总成本
    df['增加一个业务量后的总成本'] = (df[business_volume_column] + 1) * df[unit_price_column]
    df['增加一个业务量后的剩余成本'] = total_cost - df['增加一个业务量后的总成本']
    
    # 找到增加一个业务量后剩余成本最接近0的行
    min_diff_index = df['增加一个业务量后的剩余成本'].abs().idxmin()
    
    # 增加该行的业务量
    df.at[min_diff_index, business_volume_column] += 1
    current_total_cost += df.at[min_diff_index, unit_price_column]
    remaining_cost -= df.at[min_diff_index, unit_price_column]

# 计算每行的成本
df['成本'] = df[business_volume_column] * df[unit_price_column]

# 将成本列四舍五入到两位小数
df['成本'] = df['成本'].round(2)

# 打印最终状态
print("\n最终状态:")
print(df)
print(f"最终总成本: {current_total_cost:.2f}")

# 检查是否达到目标
if not np.isclose(current_total_cost, total_cost):
    print("警告: 无法完全达到目标总成本")

# 将结果保存回Excel文件（可选）
output_file_path = r'd:\费用_计算后.xlsx'
df.to_excel(output_file_path, index=False)